type EventType = "click" | "zoom" | "moveend" | "mouseenter" | "mouseleave" | "dragend" | "rotate" | "contextmenu";

interface EventCallback {
  (event: mapboxgl.MapMouseEvent | mapboxgl.Event): void;
}

let eventListeners: { [key in EventType]?: EventCallback[] } = {};

const eventManager = {
  /**
   * 添加事件监听器
   * @param map 地图实例
   * @param eventType 事件类型
   * @param callback 事件回调函数
   */
  addEventListener(map: any, eventType: EventType, callback: EventCallback): void {
    // 如果没有此类型的监听器，则初始化为空数组
    if (!eventListeners[eventType]) {
      eventListeners[eventType] = [];
    }

    // 添加新的事件回调
    eventListeners[eventType]?.push(callback);

    // Mapbox 注册该事件
    map.on(eventType, callback);
  },
  /**
   * 移除事件监听器
   * @param map 地图实例
   * @param eventType 事件类型
   * @param callback 事件回调函数
   */
  removeEventListener(map: any, eventType: EventType, callback: EventCallback): void {
    const listeners = eventListeners[eventType];
    if (listeners) {
      // 只移除匹配的回调
      eventListeners[eventType] = listeners.filter(fn => fn !== callback);
      if (eventListeners[eventType]?.length === 0) {
        // 如果没有监听器了，直接从对象中删除该事件类型
        delete eventListeners[eventType];
      }

      // 移除 Mapbox 上的事件监听
      map.off(eventType, callback);
    }
  },
  /**
   * 移除所有事件监听器
   * @param map 地图实例
   */
  removeAllEventListeners(map: any): void {
    Object.keys(eventListeners).forEach(eventType => {
      const listeners = eventListeners[eventType as EventType];
      if (listeners) {
        listeners.forEach(callback => {
          map.off(eventType as EventType, callback);
        });
      }
    });

    // 清空事件监听记录
    eventListeners = {};
  },
  /**
   * 触发所有的事件监听器（仅用于测试等场景）
   * @param eventType 事件类型
   * @param event 事件对象
   */
  triggerEvent(eventType: EventType, event: mapboxgl.MapMouseEvent | mapboxgl.Event): void {
    const listeners = eventListeners[eventType];
    if (listeners) {
      listeners.forEach(callback => {
        callback(event);
      });
    }
  }
};

export { eventManager };
